package com.itheima.reggie.mapper;

import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Dish;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface DishMapper {

    @Select("select count(*) from dish where category_id = #{categoryId}")
    Integer countByCategoryId(String categoryId);

    @Options(useGeneratedKeys = true, keyProperty = "id")
//在插入数据时会将数据库表中自增字段id自动生成的值赋给Service层调用此insert方法时传递的dishDto对象中的成员变量id,从而在Service层中可以获得自动生成的id字段
    @Insert("insert into dish values (null,#{name},#{categoryId},#{price},#{code},#{image},#{description},#{status},0,#{createTime},#{updateTime},#{createUser},#{updateUser},0)")
    void insert(DishDto dishDto);


//    @Results(id = "whatever", value = {
//            @Result(column = "d.name", property = "name"),
//            @Result(column = "c.name", property = "categoryName")
//    })
    /*
    @Results(id = "whatever", value = {
            @Result(column = "d.name", property = "name"),
            @Result(column = "c.name", property = "categoryName")
    })
    在Mybatis中使用@Result注解进行结果集映射时,c表d表含有同名字段时可以用d.name和c.name的形式进行区分吗?如果不可以要怎么写?


    在Mybatis中，当结果集中含有同名字段时，可以使用别名来解决这个问题，而不必使用完整的列名。在这种情况下，可以使用AS关键字来为每个列提供别名，然后在@Result注解中使用这些别名。例如，如果在查询中使用了以下列名：

    ```
    SELECT d.name AS department_name, c.name AS category_name FROM table_name
    ```

    那么你可以在@Result注解中使用这些别名：

    ```
     @Results(id = "whatever", value = {
     @Result(column = "department_name", property = "name"),
     @Result(column = "category_name", property = "categoryName")
     })
     ```

     这样就可以正确地将结果集中的每个列映射到相应的Java属性中。

     那我为什么不直接将Java属性的名字改成列的别名呢?那样不是就可以不需要使用@Results了吗?

     你的想法是可行的，如果你能够控制SQL查询并为每个列设置别名，那么你确实可以将Java属性的名称与别名保持一致，这样就不需要使用@Results注解了。

     然而，这种方式可能会带来一些问题。首先，如果你正在使用一个由其他人编写的查询，那么你可能无法更改查询并为每个列设置别名。其次，即使你能够更改查询并为每个列设置别名，这种方式可能会导致Java类的属性名与数据库中的列名不一致，这可能会增加代码的复杂性并使代码更难以维护。

     因此，在使用Mybatis时，通常建议使用@Results注解来显式地将列名映射到Java属性名，这样可以使代码更加清晰易懂，也可以减少出现问题的可能性。
     */

    @Select("select *,c.name as categoryName from dish as d,category as c where d.category_id = c.id and d.name like concat(\"%\",ifnull(#{name},\"\"),\"%\")")
    List<DishDto> selectAllByName(String name);


    @Delete("delete from dish where id = #{id}")
    void delete(String id);

    @Update("update dish set status = #{status} where id = #{id}")
    void updateStatus(String id, int status);

    @Select("select * from dish where id = #{id}")
    DishDto selectAllById(String id);

    @Update("update dish set name = #{name},category_id = #{categoryId},price = #{price},image = #{image},description = #{description},update_time = #{updateTime},update_user = #{updateUser} where id = #{id}")
//修改dish表中name category_id price image description update_time update_user属性
    void updateById(DishDto dishDto);

    @Select("select * from dish where category_id = #{categoryId}")
    List<Dish> selectByCategoryId(String categoryId);
}
